﻿using JESAI.Core.Websocket.Client.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace JESAI.Core.Websocket.Client.Validations
{
    internal static class Validations
    {
        /// <summary>
        /// 如果值为null或为空/空格，则抛出 <exception cref="WebsocketBadInputException"></exception> 
        /// </summary>
        /// <param name="value"> 待验证的值 </param>
        /// <param name="name"> 输入参数名称 </param>
        public static void ValidateInput(string value, string name)
        {
            if (string.IsNullOrEmpty(value))
            {
                throw new WebsocketBadInputException($"输入字符串参数 '{name}' 为null或为空。请更正。");
            }
        }

        /// <summary>
        /// 如果值为null或为空/空格，则抛出 <exception cref="WebsocketBadInputException"></exception>
        /// </summary>
        /// <param name="value"> 待验证的值 </param>
        /// <param name="name"> 输入参数名称 </param>
        public static void ValidateInput<T>(T value, string name)
        {
            if (Equals(value, default(T)))
            {
                throw new WebsocketBadInputException($"输入参数 '{name}' 是 null。请更正。");
            }
        }

        /// <summary>
        /// 如果集合为null或集合为空，它将抛出 <exception cref="WebsocketBadInputException"></exception> 
        /// </summary>
        /// <param name="collection"> 待验证的集合 </param>
        /// <param name="name"> 输入参数名称 </param>
        public static void ValidateInputCollection<T>(IEnumerable<T> collection, string name)
        {
            ValidateInput(collection, name);

            if (!collection.Any())
            {
                throw new WebsocketBadInputException($"输入集合 '{name}' 是空。请更正。");
            }
        }

        /// <summary>
        /// 如果集合为null或集合为空，它将抛出 <exception cref="WebsocketBadInputException"></exception> 
        /// </summary>
        /// <param name="value"> 待验证的集合 </param>
        /// <param name="name"> 输入参数名称 </param>
        /// <param name="minValue"> 输入的最小值 </param>
        /// <param name="maxValue"> 输入的最大值 </param>
        public static void ValidateInput(int value, string name, int minValue = int.MinValue, int maxValue = int.MaxValue)
        {
            if (value < minValue)
            {
                throw new WebsocketBadInputException($"输入参数 '{name}' 低于 {minValue}。请更正。");
            }
            if (value > maxValue)
            {
                throw new WebsocketBadInputException($"输入参数 '{name}' 高于 {maxValue}。请更正。");
            }
        }

        /// <summary>
        /// 如果值不在指定范围内，它将抛出 <exception cref="WebsocketBadInputException"></exception> 
        /// </summary>
        /// <param name="value"> 待验证的集合 </param>
        /// <param name="name"> 输入参数名称 </param>
        /// <param name="minValue"> 输入的最小值 </param>
        /// <param name="maxValue"> 输入的最大值 </param>
        public static void ValidateInput(long value, string name, long minValue = long.MinValue, long maxValue = long.MaxValue)
        {
            if (value < minValue)
            {
                throw new WebsocketBadInputException($"输入参数 '{name}' 低于 {minValue}。请更正。");
            }
            if (value > maxValue)
            {
                throw new WebsocketBadInputException($"输入参数 '{name}' 高于 {maxValue}。请更正。");
            }
        }

        /// <summary>
        /// 如果值不在指定范围内，它将抛出 <exception cref="WebsocketBadInputException"></exception> 
        /// </summary>
        /// <param name="value"> 待验证的集合 </param>
        /// <param name="name"> 输入参数名称 </param>
        /// <param name="minValue"> 输入的最小值 </param>
        /// <param name="maxValue"> 输入的最大值 </param>
        public static void ValidateInput(double value, string name, double minValue = double.MinValue, double maxValue = double.MaxValue)
        {
            if (value < minValue)
            {
                throw new WebsocketBadInputException($"输入参数 '{name}' is lower than {minValue}。请更正。");
            }
            if (value > maxValue)
            {
                throw new WebsocketBadInputException($"输入参数 '{name}' is higher than {maxValue}。请更正。");
            }
        }
    }
}
